package Behavioral.Observer.push;

import java.util.ArrayList;
import java.util.List;


//观察者模式是为了满足监听的需求。也就是说当某件事情发生的时候， 一个或多个观察者需要获知此事件的发生， 如果每个观察者都采用轮询的方式判断事件是否发生，则会耗费较多的资源。
// 所以这个任务就应该由被观察者来完成， 即被观察者持有多个观察者对象， 当自身某事件发生的时候， 去通知所有观察者。这样一种机制就是观察者模式。

//但是这其中会有一些安全问题，比如说被观察者持有观察者对象，这时观察者就完全暴露给了被观察者，这种情况应该避免出现。
// 所以就自然引出了接口的概念，以一个接口来统一观察者的行为， 被观察者只持有该接口， 任何一个实现了该接口的对象，都可以作为观察者被其持有， 而对象的其他细节则不对被观察者开放。

//监听
//抽象目标：被观察者
//推模式：目标对象主动向所有观察者推送，观察者被动做出响应，观察者不知道是否被通知
//这种方式观察者只监听一个目标
public abstract class Subject
{
    protected List<Observer> observers=new ArrayList<Observer>();
    //增加观察者方法
    public void add(Observer observer)
    {
        observers.add(observer);
    }
    //删除观察者方法
    public void remove(Observer observer)
    {
        observers.remove(observer);
    }
    public abstract void notifyObserver(); //通知观察者方法
}